const { Service } = require('egg')
const _ = require('lodash')
const NodeCache = require('node-cache')
const cache = new NodeCache()

const CACHE_KEY = 'DICT'

class DictService extends Service {
  // 本地字典
  get localDict() {
    const { dict } = this.config
    const returnData = {}

    for (const key in dict) {
      returnData[key] = toArray(dict[key])
    }

    return returnData
  }

  // 获取字典
  async getDict() {
    const { localDict } = this

    const systemDict = await this.getSystemDict()

    return {
      ...localDict,
      ...systemDict,
    }
  }

  // 获取系统字段
  async getSystemDict() {
    const cacheData = cache.get(CACHE_KEY)
    if (cacheData) return cacheData

    const { ctx } = this

    const data = {}
    const systemDictMaps = {}
    const constantMaps = {}

    const dicts = await ctx.model.Dict.find().populate('data')

    dicts.map((item) => {
      const key = _.camelCase(item.type || item.name)
      const values = {}
      const options = item.data.map((item) => {
        let label = item.name
        let value = item.value || label

        if (!isNaN(value)) value = Number(value)

        // 将数据转换成config.dict使用
        values[value] = label

        // 将数据加入到常量中
        if (item.isConst && item.type) constantMaps[item.type.toLocaleUpperCase()] = value // 驼峰

        return {
          label,
          value,
        }
      })

      data[key] = options
      systemDictMaps[key] = values
    })

    // 当前处理主要是为了model中无法调用service
    Object.assign(this.config.dict, systemDictMaps)
    Object.assign(this.config.constant, constantMaps)

    cache.set(CACHE_KEY, data)

    return data
  }

  // 更新字典
  async updateDict() {
    const keys = cache.keys()
    keys.length && cache.del(keys)

    await this.getDict()
  }

  // /**
  //  * 获取全部字典（键值对）
  //  */
  // getDictAll() {
  //   return this.config.dict
  // }

  // /**
  //  * 获取全部字典（数组）
  //  */
  // getDictAllArr() {
  //   const { dict } = this.config
  //   const returnData = {}

  //   for (const key in dict) {
  //     returnData[key] = this.toArray(dict[key])
  //   }

  //   return returnData
  // }

  // /**
  //  *  获取字典（键值对）
  //  */
  // getDict(key) {
  //   key = _.camelCase(key)
  //   return this.config.dict[key]
  // }

  // /**
  //  *  获取字典（数组）
  //  */
  // getDictArr(key) {
  //   key = _.camelCase(key)
  //   const dict = this.getDict(key)
  //   const arr = this.toArray(dict)

  //   return arr
  // }

  // /**
  //  * 按原始数组形式对外
  //  */
  // toArray(data) {
  //   const arr = []

  //   for (let key in data) {
  //     arr.push({
  //       label: data[key],
  //       value: key,
  //     })
  //   }

  //   return arr
  // }
}

/**
 * 按原始数组形式对外
 */
function toArray(data) {
  const arr = []

  for (let key in data) {
    let value = key

    if (!isNaN(value)) value = Number(value)

    arr.push({
      label: data[key],
      value,
    })
  }

  return arr
}
module.exports = DictService
